/*********************************************************************************
 * Software License Agreement (BSD License)
 * Copyright (c) 2012, Carlos D. Correa (info@ngraph.org)
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of netzen nor the
 *    names of its contributors may be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *********************************************************************************/
#ifndef LINLOGLAYOUT_H
#define LINLOGLAYOUT_H

#include "layout.h"
#include "ui/uiUtils.h"

#include <vector>
using namespace std;

class LinlogLayout:public Layout, TimerListener {
  float timestep;
  float T; // temperature

  float totalEnergy;
  bool running;
  vector<int> visible;
  Timer *timer;

  vector<float> energy;
  float barycenter[2];
  float repuFactor, attrFactor, gravFactor;
protected:
  float attrExponent;
  float repuExponent;
  float getDist(int i, int j);
  float getDistToBarycenter(int i);
  void getDirection(int i, float *dir);
  float getEnergy(int i);

 public:
  LinlogLayout(const char *name);
  virtual void update(string property);

  void setTimestep(float ts);
  float getEnergy();
  bool isRunning();
  void setRunning(bool value);

  virtual void setGraph(Graph *g);
  virtual int numNodes();
  virtual bool isNodeinLayout(int i);
  virtual bool isEdgeinLayout(int i, int j);
  virtual bool isNodeUpdatable(int i);

  virtual int numNeighbors(int i);
  virtual int getNeighbor(int i, int k) ;
  void updateVisible();
  void computeIteration();
  void reset();
  void compute();
  void computeBaryCenter();
  void initEnergyFactors();

  virtual void timerEvent();
};

Layout *createLinlogLayout(string name);

#endif
